home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / Main.bin / CharArrayReader.java < prev    next >
Text File  |  1998-09-22  |  5KB  |  200 lines

  1. /*
  2.  * @(#)CharArrayReader.java    1.8 98/07/01
  3.  *
  4.  * Copyright 1995-1998 by Sun Microsystems, Inc.,
  5.  * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
  6.  * All rights reserved.
  7.  * 
  8.  * This software is the confidential and proprietary information
  9.  * of Sun Microsystems, Inc. ("Confidential Information").  You
  10.  * shall not disclose such Confidential Information and shall use
  11.  * it only in accordance with the terms of the license agreement
  12.  * you entered into with Sun.
  13.  */
  14.  
  15. package java.io;
  16.  
  17. /**
  18.  * This class implements a character buffer that can be used as a
  19.  * character-input stream.
  20.  *
  21.  * @author    Herb Jellinek
  22.  * @version     1.8, 07/01/98
  23.  * @since       JDK1.1
  24.  */
  25. public
  26. class CharArrayReader extends Reader {
  27.     /** Character buffer */
  28.     protected char buf[];
  29.  
  30.     /** Current buffer position */
  31.     protected int pos;
  32.  
  33.     /** Position of mark in buffer */
  34.     protected int markedPos = 0;
  35.  
  36.     /** Number of valid characters in buffer */
  37.     protected int count;
  38.  
  39.     /**
  40.      * Create an CharArrayReader from the specified array of chars.
  41.      * @param buf    Input buffer (not copied)
  42.      * @since JDK1.1
  43.      */
  44.     public CharArrayReader(char buf[]) {
  45.     this.buf = buf;
  46.         this.pos = 0;
  47.     this.count = buf.length;
  48.     }
  49.  
  50.     /**
  51.      * Create an CharArrayReader from the specified array of chars.
  52.      * @param buf    Input buffer (not copied)
  53.      * @param offset    Offset of the first char to read
  54.      * @param length    Number of chars to read
  55.      * @since JDK1.1
  56.      */
  57.     public CharArrayReader(char buf[], int offset, int length) {
  58.     this.buf = buf;
  59.         this.pos = offset;
  60.     this.count = Math.min(offset + length, buf.length);
  61.     }
  62.  
  63.     /** Check to make sure that the stream has not been closed */
  64.     private void ensureOpen() throws IOException {
  65.     if (buf == null)
  66.         throw new IOException("Stream closed");
  67.     }
  68.  
  69.     /**
  70.      * Read a single character.
  71.      * 
  72.      * @exception   IOException  If an I/O error occurs
  73.      * @since       JDK1.1
  74.      */
  75.     public int read() throws IOException {
  76.     synchronized (lock) {
  77.         ensureOpen();
  78.         if (pos >= count)
  79.         return -1;
  80.         else
  81.         return buf[pos++];
  82.     }
  83.     }
  84.  
  85.     /**
  86.      * Read characters into a portion of an array.
  87.      * @param b     Destination buffer
  88.      * @param off  Offset at which to start storing characters
  89.      * @param len   Maximum number of characters to read
  90.      * @return  The actual number of characters read, or -1 if
  91.      *         the end of the stream has been reached
  92.      * 
  93.      * @exception   IOException  If an I/O error occurs
  94.      * @since       JDK1.1
  95.      */
  96.     public int read(char b[], int off, int len) throws IOException {
  97.     synchronized (lock) {
  98.         ensureOpen();
  99.         if (pos >= count) {
  100.         return -1;
  101.         }
  102.         if (pos + len > count) {
  103.         len = count - pos;
  104.         }
  105.         if (len <= 0) {
  106.         return 0;
  107.         }
  108.         System.arraycopy(buf, pos, b, off, len);
  109.         pos += len;
  110.         return len;
  111.     }
  112.     }
  113.  
  114.     /**
  115.      * Skip characters.
  116.      * @param n The number of characters to skip
  117.      * @return    The number of characters actually skipped
  118.      * 
  119.      * @exception   IOException  If an I/O error occurs
  120.      * @since       JDK1.1
  121.      */
  122.     public long skip(long n) throws IOException {
  123.     synchronized (lock) {
  124.         ensureOpen();
  125.         if (pos + n > count) {
  126.         n = count - pos;
  127.         }
  128.         if (n < 0) {
  129.         return 0;
  130.         }
  131.         pos += n;
  132.         return n;
  133.     }
  134.     }
  135.  
  136.     /**
  137.      * Tell whether this stream is ready to be read.  Character-array readers
  138.      * are always ready to be read.
  139.      *
  140.      * @exception  IOException  If an I/O error occurs
  141.      * @since       JDK1.1
  142.      */
  143.     public boolean ready() throws IOException {
  144.     synchronized (lock) {
  145.         ensureOpen();
  146.         return (count - pos) > 0;
  147.     }
  148.     }
  149.  
  150.     /**
  151.      * Tell whether this stream supports the mark() operation, which it does.
  152.      * @since       JDK1.1
  153.      */
  154.     public boolean markSupported() {
  155.     return true;
  156.     }
  157.  
  158.     /**
  159.      * Mark the present position in the stream.  Subsequent calls to reset()
  160.      * will reposition the stream to this point.
  161.      *
  162.      * @param  readAheadLimit  Limit on the number of characters that may be
  163.      *                         read while still preserving the mark.  Because
  164.      *                         the stream's input comes from a character array,
  165.      *                         there is no actual limit; hence this argument is
  166.      *                         ignored.
  167.      *
  168.      * @exception  IOException  If an I/O error occurs
  169.      * @since       JDK1.1
  170.      */
  171.     public void mark(int readAheadLimit) throws IOException {
  172.     synchronized (lock) {
  173.         ensureOpen();
  174.         markedPos = pos;
  175.     }
  176.     }
  177.  
  178.     /**
  179.      * Reset the stream to the most recent mark, or to the beginning if it has
  180.      * never been marked.
  181.      *
  182.      * @exception  IOException  If an I/O error occurs
  183.      * @since       JDK1.1
  184.      */
  185.     public void reset() throws IOException {
  186.     synchronized (lock) {
  187.         ensureOpen();
  188.         pos = markedPos;
  189.     }
  190.     }
  191.  
  192.     /**
  193.      * Close the stream.
  194.      * @since       JDK1.1
  195.      */
  196.     public void close() {
  197.     buf = null;
  198.     }
  199. }
  200.